console.log('准备工作')



// for(let i = 0; i < 3; i ++) {
//     for(let j = 0; j < 3; j ++) {
//         console.log(i)
//     }
// } 
// console.log('=========')
// for(let i = 0; i < 3; i ++) {
//     for(let i = 0; i < 3; i ++) {
//         console.log(i)
//     }
// } 
// ===================================================


// let b = 100
// // const c = b
// process.nextTick(() => {
//     // console.log(b)
//     let b = 150
//     // 声明了同名变量   
//     // 那么在这个作用域内   
//     // 外层的同名变量就别想进来了   
//     // 除非你换个身份  才能进来
//     // console.log(b)
// })

// ===================================================

// for循环有两层作用域
// for(let i = 0; i < 3; i ++) {
//     let i = 'foo'
//     console.log(i)
// } 
// 当内层独立声明了i  外层i  不会进入内层作用域

// const obj = {}
// obj.name = 'zce'

// 数组的解构
// const arr = [100, 200, 300]
// const [a, b, c] = arr
// // console.log(a)

// // 对象的解构
// const obj = { name: 'zce', age: 18 }
// const {name} = obj


// const list = []
// const listProxy = new Proxy(list, {
//     set (target, property, value) {
//         console.log('set', property, value)
//         target[property] = value
//         return true
//     }
// })

// listProxy.push(100)
// const obj = {
//     foo: "123",
//     bar: "456"
// }

// const proxy = new Proxy(obj, {
//     get(target, property) {
//         return Reflect.get(target, property)
//     }
// })

// console.log(proxy.foo)

// class Person {
//     constructor (name) {
//         this.name = name
//     }
//     // static
// }

// class students extends Person {
//     constructor (name, number) {
//         super(name) 
//         this.number = number
//     }

// }

// const s = new Set()
// s.add(1).add(2).add(3).add(4).add(2)

// console.log(s.has(100))

// const obj = {}

// obj[true] = 'value'
// obj[123] = 'value'
// obj[{a:1}] = 'value'

// console.log(Object.keys(obj))


// const m = new Map()
// const tom = { name: 'Tom' }
// m.set(tom, 'a')


// const cache = []

// cache['foo'] = Math.random()

// cache['foo'] = '123'

// console.log(cache)

// const s1 = Symbol.for('foo')
// const s2 = Symbol.for('foo')


// console.log(s1)
// console.log(s2)


// const arr = [100, 200, 300, 400]
// for(const item of arr) {
//     console.log(item)
// }

// const obj = { foo: 123, bar: 456 }
// for(const item of obj) {
//     console.log(item)
// }

// 实现可迭代接口
// const obj = {
//     store: ['foo', 'bar', 'baz'],
//     [Symbol.iterator]: function() {
//         let index  = 0
//         const self = this
//         return {
//             next: function () {
//                 const result = {
//                     value: self.store[index],
//                     done: index >= self.store.length
//                 }
//                 index ++
//                 return result
//             }
//         }
        
//     }
// }

// for(const item of obj) {
//     console.log(item)
// }

// 迭代器模式

// const todos = {
//     life: ['吃饭', '睡觉', '打豆豆'],
//     learn: ['语文', '数学', '外语'],
//     work: ['喝茶'],
//     each: function(callback) {
//         const all = [].concat(this.life,this.learn,this.work)
//         for(const item of all) {
//             callback(item)
//         }
//     },
//     [Symbol.iterator]: function() {
//         const all = [...this.life, ...this.learn, ...this.work]
//         let index = 0
//         return {
//             next: function () {
//                 return {
//                     value: all[index],
//                     done: index ++ >= all.length
//                 }
//             }
//         }
//     }
// }


// for(const item of todos) {
//     console.log(item)
// }